<?php
namespace phiction;

// generate namespace path (not filesystem path!)
class path
{
    static function root_module(): string
    {
        return '\modules';
    }

    static function module(string $module): string
    {
        if (preg_match('#[^_a-z0-9]#', $module)) throw new \InvalidArgumentException("invalid module name: $module");
        $root = self::root_module();
        return $root . '\\' . $module;
    }

    static function module_class(string $module, string $class): string
    {
        $prefix = self::module($module);
        if (preg_match('#[^_a-z0-9]#', $class)) throw new \InvalidArgumentException("invalid class name for module $module: $class");
        return $prefix . '\\' . $class;
    }

    static function root_module_class(string $class): string
    {
        $prefix = self::root_module();
        if (preg_match('#[^_a-z0-9]#', $class)) throw new \InvalidArgumentException("invalid class name for root module: $class");
        return $prefix . '\\' . $class;
    }

    static function module_storage(string $module): string
    {
        return self::module_class($module, 'storage');
    }

    static function module_page(string $module): string
    {
        return self::module_class($module, 'page');
    }

    static function module_api(string $module): string
    {
        return self::module_class($module, 'api');
    }

    static function root_module_page(): string
    {
        return self::root_module_class('page');
    }

    static function exists(string $path): bool
    {
        try {
            return class_exists($path);
        }
        catch (exceptions\no_such_class $ex) {
            return false;
        }
    }

    static function module_has_storage(string $module): bool
    {
        return self::exists(self::module_storage($module));
    }

    static function module_iter()
    {
        $it = new \DirectoryIterator("modules");
        foreach ($it as $file_info)
            if (!$file_info->isDot() && $file_info->isDir())
                yield $file_info->getFilename();
    }
}

